#pragma once

#include "stdafx.h"
#include <string.h>
#include <windows.h>

const char VAZIO[] = "--";
const int TAMANHO_FILA = 100;

class ListaCircular
{
	int ultimoRegistroEscrita;
	int ultimoRegistroLeitura;

	char nome[100];
	char mensagens[TAMANHO_FILA][50];
	HANDLE ghMutexEscrita;
	HANDLE ghMutexLeitura;
	
public:
	ListaCircular(char*);
	int Adiciona(char*);
	char* Consome();
};

ListaCircular::ListaCircular(char* fila)
{
	ultimoRegistroEscrita = 0; 
	ultimoRegistroLeitura = 0;
	strcpy_s(nome, fila); 
	ghMutexEscrita = CreateMutex(NULL, false, NULL);
	ghMutexLeitura = CreateMutex(NULL, false, NULL);
	for (int i = 0; i < TAMANHO_FILA; i++)
	{
		strcpy_s(mensagens[i], VAZIO);
	}
}

int ListaCircular::Adiciona(char* msg)
{
	WaitForSingleObject(ghMutexEscrita, INFINITE);
	int posicao = ultimoRegistroEscrita;
	ultimoRegistroEscrita++;
	if (ultimoRegistroEscrita == TAMANHO_FILA)
	{
		ultimoRegistroEscrita = 0;
	}
	while (strcmp(mensagens[posicao], VAZIO))
	{
		printf("Fila %s cheia. Aguardando.\n", nome);
		WaitForSingleObject(CreateEvent(NULL, true, false, NULL), 200);
	}
	strcpy_s(mensagens[posicao], msg);
	printf("FILA %s: %s\n", nome, mensagens[posicao]);
	ReleaseMutex(ghMutexEscrita);
	return 0;
}

char* ListaCircular::Consome()
{
	WaitForSingleObject(ghMutexLeitura, INFINITE);
	char *msg = new char[90];
	strcpy_s(msg, 50, mensagens[ultimoRegistroLeitura]);
	msg[49] = '\0';
	if (strcmp(mensagens[ultimoRegistroLeitura], VAZIO))
	{
		strcpy_s(mensagens[ultimoRegistroLeitura], VAZIO);
		ultimoRegistroLeitura++;
		if (ultimoRegistroLeitura == TAMANHO_FILA)
		{
			ultimoRegistroLeitura = 0;
		}
	}
	ReleaseMutex(ghMutexLeitura);
	return msg;
}